<?php
/** Copyright 2014 TinPhp Systems, Inc.
 * @author zhangxilian 2014-7-15
 */
if (!defined('IN_TINPHP')) {
	exit ('Access Denied');
}
/**
 * 常用的几种业务逻辑类
 * @example 第一种应用(推荐):
 * 
   //TinPHP框架默认不引用，可以将改引用放在 app/controller/indexApp.php 基类中
    * (2014-8-29 TinAppController基类已经加入自动new Class 可以不用引入)
   require_once(TIN_APP_PATH.'include/TinPHP/CommonLogic.php'); 
   require_once(TIN_APP_PATH.'app/view/AssignTable.php');
   
   $accountView = new AssignTable('account');
   $comLogic = new CommonLogic($accountView); //view表类参数必须
   
   同时支持 $comLogic = new CommonLogic('account'); 如果参数不是object会自动加载AssignTable通用表视图
   
   $res = $comLogic->getTableAll("*", "1=1");
   var_dump($res);
 * @example 数组条件方式建议使用
$cond = array();
$cond['id'] = "1";
$cond['username'] = "'admin'";
$uList = $comLogic->getTableAll("*", $cond); 
 * 
 */
class CommonLogic extends TinBaseLogic {

	private $commDao;

	/** 构造一个通用的业务逻辑类
     * @param object $viewObj view类对象 或 表名，如果表名默认加载view/AssignTable、AssignView
     * @param string $viewType  如果view参数是表名，该参数有效  table:表(默认), view:视图
     *  */
    public function CommonLogic($view, $viewType="table") {        
		parent::__construct();
		$this->log_type = "CommonLogic"; //设置产生日志的Logic类名
		
		if(is_object($view)){
        	$this->commDao = Tin::getViewDAO($view);
		}else{
			if($viewType=='view'){
				$this->commDao = Tin::getDAO("AssignView",$view);
			}else{
				$this->commDao = Tin::getDAO("AssignTable",$view);
			}
		}
	}
	
	public function __destruct(){
		$this->commDao = null;
	}
//=========================================通用方法=============================================================
	/** 根据指定条件获取统计记录数
     * @param string $cond 要统计的条件
	 * @param string $subject 用于distinct字段名
	 * @param string $extra 附加条件，或排序
	 * @param array $params 可以执行绑定变量使用 array类型
	 * @author zhangxilian 2014-7-15 */
    public function getTableCount($cond, $subject = null, $extra = null, $params = false){
        $condStmt = $this->getCondStr($cond);
		return $this->commDao->getCountByCond($condStmt, $subject, $extra, $params);
	}
    /** 获取指定条件单条记录
     * @param string $cols 要查找的字段名称,默认所有“*”
     * @param string $cond 查询条件,支持数组 array("字段1"=>"条件1","字段2"=>"条件2"...)
     * @param array $params 可以执行绑定变量使用 array类型 */
	public function getTableItem($cols, $cond, $params = false){
        $condStmt = $this->getCondStr($cond);
		return $this->commDao->selectRowByCond($cols, $condStmt, $params);
	}
    /** 根据指定条件获取所有数据,不分页
     * @param string $cols 要查找的字段名称,默认所有“*”
     * @param string $cond 查询条件,支持数组 array("字段1"=>"条件1","字段2"=>"条件2"...)
     * @param string $order_by 排序 order by ?
     * @param array $params 可以执行绑定变量使用 array类型 
     *  */
    public function getTableAll($cols, $cond, $order_by=null, $params = false){
        $condStmt = $this->getCondStr($cond);
        return $this->commDao->selectAll($cols, $condStmt, $order_by, $params);
    }
	/** 根据指定条件获取分页列表数据
     * @param string $cols 要查找的字段名称,默认所有“*”
     * @param string $cond 查询条件,支持数组 array("字段1"=>"条件1","字段2"=>"条件2"...)
     * @param string $order_by 排序 order by ?
     * @param int $page 当前页数
     * @param int $size 每页显示数
     * @author zhangxilian 2014-7-15 */
	public function getTableList($cols, $cond, $order_by  = null, $page = null, $size = null){
        $condStmt = $this->getCondStr($cond);
        $res = array();
		$res["data"] = $this->commDao->selectByCond($cols, $condStmt . " " . $order_by, $page, $size);
		if ($page){
			$res["count"] = $this->commDao->getCountByCond($condStmt);
		}
		return $res;
	}
    /** 添加表记录
     * @param array $data 数据数组 */
	public function insertItem($data){
		$map = Tin :: createDataMap();
        foreach($data as $key=>$val){
            $map->addEntry(strtoupper($key), $val, DB::VARCHAR);
        }
		//$map->addEntry('CREATE_TIME', date("Y-m-d H:i:s"), DB::DATETIME);
		try{
			$res = $this->commDao->insert($map, false, true);
			return $res;
		}catch(Exception $e){
            $this->logger->error("insertItem:".$e->getMessage());
			return null;
		}
	}
	/** 根据指定条件更新记录
     * @param array $data 数据数组
     * @param string $cond 更新条件,支持数组 array("字段1"=>"条件1","字段2"=>"条件2"...)
     *  */
	public function updateByCond($data, $cond, $params=false){
        $condStmt = $this->getCondStr($cond);
        try{
            $map = Tin :: createDataMap();
            foreach($data as $key=>$val){
                if(!empty($val) && $val != null)
                    $map->addEntry(strtoupper($key), $val, DB::VARCHAR);
            }            
            $res = $this->commDao->updateByCond($map, $condStmt, false, $params);
            return $res;
        } catch(Exception $e){
            $this->logger->error("updateByCond:".$e->getMessage());
            return false;
        }
	}	
	/** 根据条件更新指定字段
	 * @param array $dataArr 要更新的字段值数组
	 * @param string $cond 条件,支持数组 array("字段1"=>"条件1","字段2"=>"条件2"...)
	 * @param array $params 绑定变量
	 * @author ZhangXiLian 2014-8-29 */
	public function updateFieldVal($dataArr, $cond, $params=false){
		if(!is_array($dataArr))return false;
		$condStmt = $this->getCondStr($cond);
		$map = Tin :: createDataMap();
		foreach ($dataArr as $k=>$v){
			$map->addEntry(strtoupper($k), $v, DB::INT);
		}
		$res = $this->commDao->updateByCond($map, $cond, false, $params);
		return $res;
	}
	
	/** 删除指定角色记录
     * @param string @cond 条件,支持数组 array("字段1"=>"条件1","字段2"=>"条件2"...)
     * @param array $params 可以执行绑定变量使用 array类型 */
	public function delRoleItem($cond, $params = false){
        $condStmt = $this->getCondStr($cond);
		return $this->commDao->deleteByCond($condStmt, $params);
	}
	
	/** 根据条件设置，重组条件，支持数组条件
	 * @param string/array $cond 条件，可以是字符串或数组,建议使用 指定key数组条件
	 * */
	private function getCondStr($cond){
		$condStmt = "";
		if(is_array($cond)){
			foreach($cond as $k=>$v){
				if($condStmt!="") $condStmt .= " and ";
				if(is_numeric($k)){
					$condStmt .= $v;
				}else{
					$condStmt .= " $k=$v";
				}
			}
		}else{
			$condStmt = $cond;
		}
		return $condStmt;
	}
}//End Class
?>
